#include "stm32f10x.h"                  // Device header

void MySPI_W_SS(uint8_t BitValue)										//为了写入SS的片选，只需要改变0 / 1变量即可
{
	GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)BitValue);
}

void MySPI_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);								//将PA4引脚初始化为推挽输出
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);								//将PA5和PA7引脚初始化为复用推挽输出

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);								//将PA6引脚初始化为上拉输入
	
	SPI_InitTypeDef SPI_InitStructure;
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;//波特率分频，选择128分频
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;							//SPI极性，选择低极性
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;						//SPI相位，选择第一个时钟边沿采样，极性和相位决定选择SPI模式0
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;					//数据宽度，选择为8位
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;	//方向，选择2线全双工
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;					//先行位，选择高位先行
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;						//模式，选择为SPI主模式
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;							//NSS，选择由软件控制
	SPI_InitStructure.SPI_CRCPolynomial = 7;							//CRC多项式，暂时用不到，给默认值7
	SPI_Init(SPI1,&SPI_InitStructure);
	
	/*SPI使能*/
	SPI_Cmd(SPI1, ENABLE);												//使能SPI1，开始运行
	
	/*设置默认电平*/
	MySPI_W_SS(1);														//SS默认高电平
}

void MySPI_Star(void)													//SPI开始，直接片选给0
{
	MySPI_W_SS(0);
}

void MySPI_Stop(void)													//SPI结束，直接片选给1
{
	MySPI_W_SS(1);
}

uint8_t MySPI_SwapByte(uint8_t ByteSend)								//SPI发送和接收，是两边同时进行的，都会有数据来
{
	while ( SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) != SET );		//等待发送数据寄存器空,SPI_I2S_GetFlagStatus是状态Status，TXE置1表示为空，可以输入数据了
	
	SPI_I2S_SendData(SPI1,ByteSend);									//写入数据到发送数据寄存器，开始产生时序
	
	while ( SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) != SET );		//等待接收数据寄存器非空
	
	return SPI_I2S_ReceiveData(SPI1);											//读取接收到的数据并返回
}

